class Person {
  // 实例属性
  String? name; // 说明此实例变量可空
  late int age; // late告诉编译器。稍后再初始化
  String hello = 'c1';
  // String  holiday;  // 如果没有默认值，则需要在构造函数中初始化   Person(this.name, this.holiday);
  int year = 2025;
  int rellAge = 0;  // 变量前面加上 `_` 代表私用属性, 不能够跨文件访问，当前文件可以

  String? weather;

  // 实例方法
  action() {
    print("any body here？");
  }

  // this代表对象本身，和java一样
  // 构造函数  注意：传统构造函数只能有一个
  Person(this.name);

  // 除了java那种传统方式外，还可以这样写
  // Person(int age):age = age;

  // 如果需要多个构造函数，可以使用命名构造函数
  Person.named(this.name, this.age);

  Person.named2(this.age);

  /**
   * 可选参数与默认值 ，，，，这样就能在构造参数给可选参数搞一个默认值，，， 不传就用默认值
   * ??符号    如果左边的值为null，则右边的值赋值给左边
   */
  Person.named3(int a, [String? weather]):age= a==6?1:0,this.weather = weather??"晴天"; // 这样写可以加上一些三目表达式
  Person.named4(this.age, [this.weather="傻子"]);  // 一般这样写，更简单易懂

  /**
   * Java的Setter方法 , 需要搭配私有属性一起使用
   */
  set sRellAge(int rellAge){
    this.rellAge = rellAge;
    year -= rellAge;
    print("birthday = $year");
  }

  get getRellAge{
      return rellAge;
  }

}

main() {
  {
    Person a = new Person('cc');
    //   Person a = Person();  // new 可以省略
    a.age = 1;
    a.age = 2;
    print(a.age);
    print(a.name);
    a.action();

    var a2 = Person('av');
  }

  // 命名构造函数
  {
    var p1 = Person.named(null, 16);
    print(p1.age);
    print(p1.name);
    p1.action();
  }

  // hash code  可以通过hashcode来判断是不是同一个对象,,,, 注意，只有对象的hashcode不一样
  {
    Person a = new Person('cc');
    print("a.hashCode = ${a.hashCode}");
    a = new Person('cc');
    print("a.hashCode = ${a.hashCode}");

    int c = 100;
    int d = 100;
    print("c.hashCode = ${c.hashCode}  ==== d.hashCode = ${d.hashCode}"); // 一样的hashCode

    String g  = "fuck you";
    String g1  = "fuck you";
    print("g.hashCode = ${g.hashCode}  ==== g1.hashCode = ${g1.hashCode}"); // 一样的hashCode
  }

  // get set,,,  系统会默认生成get set方法
  {
    var age = Person("name");
    age.rellAge = 30; // 直接复制
    age.sRellAge = 30; // 调用set方法
  }

  {
    var p1 = Person.named3(66);
    print(p1.weather);
    p1 = Person.named3(66, "傻逼");
    print(p1.weather);
  }

}
